package org.qiyu.live.id.generate.provider.service.bo;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @Author idea
 * @Date: Created in 20:00 2023/5/25
 * @Description 有序id的BO对象
 */
public class LocalSeqIdBO {

    private int id;
    /**
     * 在内存中记录的当前有序id的值
     *
     * 多线程并发场景下，需要使用原子类，保证线程安全
     * 在多线程环境下，如果直接使用一个共享的普通变量 currentNum，那么在没有同步控制的情况下进行读写操作时，可能会出现线程安全问题。例如，在并发环境下，多个线程同时读取和更新 currentNum 的值，可能导致数据不一致、丢失更新等问题。
     * 为了保证这种共享变量在并发环境下的线程安全性，可以使用 Java 并发包中的原子类（如 AtomicInteger）来替代普通的 int 类型变量。AtomicInteger 提供了一系列原子操作方法，比如：
     * get()：获取当前值
     * set(int newValue)：设置新值
     * incrementAndGet()：原子性地将当前值加1并返回新的值
     * compareAndSet(int expect, int update)：如果当前值等于预期值，则以原子方式将该值设置为给定的更新值
     * 通过使用这些原子类的方法，可以在无锁的情况下完成对 currentNum 的并发访问和修改，从而确保线程安全。
     */
    private AtomicLong currentNum;

    /**
     * 当前id段的开始值
     */
    private Long currentStart;
    /**
     * 当前id段的结束值
     */
    private Long nextThreshold;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public AtomicLong getCurrentNum() {
        return currentNum;
    }

    public void setCurrentNum(AtomicLong currentNum) {
        this.currentNum = currentNum;
    }

    public Long getCurrentStart() {
        return currentStart;
    }

    public void setCurrentStart(Long currentStart) {
        this.currentStart = currentStart;
    }

    public Long getNextThreshold() {
        return nextThreshold;
    }

    public void setNextThreshold(Long nextThreshold) {
        this.nextThreshold = nextThreshold;
    }
}
